﻿using Ext.Net;
using Ext.Net.MVC;
using PcaCore.DAL;
using PcaCore.DAL.Log;
using PcaPagos.BOL;
using PcaPagos.DAL;
using PcaWeb.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace PcaWeb.Areas.Pagos.Controllers
{
    [DirectController(AreaName = "Pagos")]
    public class RegistroController : ControllerUser
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetListFiltros()
        {
            List<oCampo> filtros = new List<oCampo>();

            filtros.Add(new oCampo(0, "Todos"));
            filtros.Add(new oCampo(1, "Pagados"));
            filtros.Add(new oCampo(2, "Pendientes"));
            filtros.Add(new oCampo(3, "Vencidos"));

            return Json(new { data = filtros }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetList(StoreRequestParameters parameters, int? filtroId, string filtro)
        {
            int total = 0;
            List<oVwRegistro> registros = null;
            switch (filtroId)
            {
                case null:
                case 0://Todos                

                    registros = dRegistro.GetList(parameters.Start,
                                                    parameters.Limit,
                                                    out total,
                                                    dSesion.GetEmpresaId(),
                                                    dSesion.GetOficinaId(),
                                                    filtro);
                    break;
                case 1://Pagados
                    registros = dRegistro.GetList(parameters.Start,
                                                    parameters.Limit,
                                                    out total,
                                                    dSesion.GetEmpresaId(),
                                                    dSesion.GetOficinaId(),
                                                    filtro,
                                                    true);
                    break;
                case 2://Pendientes
                    registros = dRegistro.GetList(parameters.Start,
                                                    parameters.Limit,
                                                    out total,
                                                    dSesion.GetEmpresaId(),
                                                    dSesion.GetOficinaId(),
                                                    filtro,
                                                    false);
                    break; 
                case 3://Vencidos
                    registros = dRegistro.GetListVencidos(parameters.Start,
                                                            parameters.Limit,
                                                            out total,
                                                            dSesion.GetEmpresaId(),
                                                            dSesion.GetOficinaId(),
                                                            filtro);
                    break; 
            }
            return this.Store(registros, total);
        }

        public Ext.Net.MVC.PartialViewResult FrmRegistrar()
        {
            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmRegistrar"
            };
        }

        private Ext.Net.MVC.PartialViewResult FrmEditar(oVwRegistro registro)
        {
            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmEditar",
                Model = registro
            };
        }

        private ActionResult FrmPagar(oVwRegistro registro)
        {
            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmPagar",
                Model = registro
            };
        }

        private ActionResult ConfirmarEliminar(oVwRegistro registro)
        {
            try
            {
                MessageBoxConfig config = new MessageBoxConfig();
                config.Title = "Confirmacion";
                config.Message = string.Format("Eliminar registro Grupo:\"{0}\" N°: \"{1}\"  monto\"{2} {3}\"",
                                               registro.nombre_grupo_movimiento,
                                               registro.strserienumero, 
                                               registro.siglas_moneda,
                                               registro.monto.ToString("##,###.00"));
                config.Closable = false;
                config.Icon = MessageBox.Icon.QUESTION;
                config.Buttons = MessageBox.Button.YESNO;
                config.MessageBoxButtonsConfig = new MessageBoxButtonsConfig
                {
                    Yes = new MessageBoxButtonConfig { Handler = string.Format("Registro.Pagos.Eliminar(\"{0}\")", registro.registro_id), Text = "Si" },
                    No = new MessageBoxButtonConfig { Text = "No" }
                };

                X.Msg.Show(config);
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        private ActionResult ConfirmarCancelarPago(oVwRegistro registro)
        {
            try
            {
                MessageBoxConfig config = new MessageBoxConfig();
                config.Title = "Confirmacion";
                config.Message = string.Format("Cancelar pago, registro Grupo:\"{0}\" N°: \"{1}\"  monto\"{2} {3}\"",
                                               registro.nombre_grupo_movimiento,
                                               registro.strserienumero,
                                               registro.siglas_moneda,
                                               registro.monto.ToString("##,###.00"));
                config.Closable = false;
                config.Icon = MessageBox.Icon.QUESTION;
                config.Buttons = MessageBox.Button.YESNO;
                config.MessageBoxButtonsConfig = new MessageBoxButtonsConfig
                {
                    Yes = new MessageBoxButtonConfig { Handler = string.Format("Registro.Pagos.CancelarPago(\"{0}\")", registro.registro_id), Text = "Si" },
                    No = new MessageBoxButtonConfig { Text = "No" }
                };

                X.Msg.Show(config);
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [DirectMethod(Namespace = "Registro")]
        public ActionResult VerificarAlertas()
        {
            try
            {
                long totalPendientes = dRegistro.GetTotalPendientesOficina(dSesion.GetEmpresaId(),
                                                                           dSesion.GetOficinaId());

                long totalVencidos = dRegistro.GetTotalVencidosOficina(dSesion.GetEmpresaId(),
                                                                       dSesion.GetOficinaId());

                string msg = string.Empty;

                if (totalPendientes > 0)
                {
                    if (totalPendientes > 1)
                        msg = String.Format("Existen {0} registros pendientes de pago", totalPendientes);
                    else
                        msg = String.Format("Existe {0} registro pendiente de pago", totalPendientes);

                    if (totalVencidos > 0)
                    {
                        if (totalVencidos > 1)
                            msg = String.Format("{0} y {1} registros vencidos", msg, totalVencidos);
                        else
                            msg = String.Format("{0} y {1} registro vencido", msg, totalVencidos);
                    }
                }
                else
                {
                    if (totalVencidos > 0)
                    {
                        if (totalVencidos > 1)
                            msg = String.Format("Existe {0} registro vencido", totalVencidos);
                        else
                            msg = String.Format("Existen {0} registros vencidos", totalVencidos);
                    }
                }

                if (totalPendientes > 0 || totalVencidos >0)
                {
                    NotificationConfig config = new NotificationConfig();
                    config.Icon = Icon.UserAlert;
                    config.Title = "Alertas";
                    config.Html = msg;
                    X.Msg.Notify(config).Show();
                }
                return this.Direct();
            }
            catch
            {
                NotificationConfig config = new NotificationConfig();
                config.Icon = Icon.Error;
                config.Title = "Alertas";
                config.Html = "Error al consultar alarmas";
                X.Msg.Notify(config).Show();
                return this.Direct();
            }
        }

        [DirectMethod(Namespace = "Registro")]
        public ActionResult Eliminar(long? registroId)
        {
            try
            {
                dRegistro.Delete(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(registroId));
                this.GetCmp<Store>("storeRegistros").LoadProxy();
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [DirectMethod(Namespace = "Registro")]
        public ActionResult CancelarPago(long? registroId)
        {
            try
            {
                dRegistro.CancelarPago(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(registroId));
                this.GetCmp<Store>("storeRegistros").LoadProxy();
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult Registrar(oRegistro model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    model.empresa_id = dSesion.GetEmpresaId();
                    model.oficina_id = dSesion.GetOficinaId();
                    model.sesion_id = dSesion.GetId();
                    model.usuario_registro_id = dSesion.GetUsuarioId();
                    dRegistro.Insert(model);
                    return Json(new { success = true });
                }
                catch (Exception ex)
                {
                    return Json(new { success = false, msg = ex.Message });
                }
            }
            return Json(new { success = false, msg = "No se envio informacion correctamente." });
        }

        [HttpPost]
        public ActionResult Actualizar(oRegistro model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    model.empresa_id = dSesion.GetEmpresaId();
                    model.oficina_id = dSesion.GetOficinaId();
                    model.sesion_id = dSesion.GetId();
                    model.usuario_actualiza_id = dSesion.GetUsuarioId(); 
                    dRegistro.Update(model);
                    return Json(new { success = true });
                }
                catch (Exception ex)
                {
                    return Json(new { success = false, msg = ex.Message });
                }
            }
            return Json(new { success = false, msg = "No se envio informacion correctamente." });
        }

        [HttpPost]
        public ActionResult Pagar(long? registro_id, string medio_pago_id, string detalle, DateTime? fecha_hora_cancelacion)
        {
            try
            {
                oVwRegistro registro = dRegistro.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(registro_id));

                if (registro == null)
                    throw new Exception("El registro ya no existe en la base de datos, posiblemente fue eliminado por otro usuario");
    
                if (string.IsNullOrEmpty(medio_pago_id))
                    throw new Exception("Medio de pago no puede ser nulo");

                if (Convert.ToDateTime(fecha_hora_cancelacion) < registro.fecha_emision)
                    throw new Exception("La fecha de cancelacion no puede ser menor a la fecha de emision");

                dRegistro.Pagar(dSesion.GetEmpresaId(),
                                dSesion.GetOficinaId(),
                                Convert.ToInt64(registro_id),
                                medio_pago_id,
                                detalle,
                                Convert.ToDateTime(fecha_hora_cancelacion));  

                return Json(new { success = true });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        public ActionResult RunCommandGrid(string commandName, long? registroId)
        {
            oVwRegistro registro = dRegistro.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(registroId));

            if (registro == null)
                return Json(new { success = false, msg = "El registro ya no existe en la base de datos, posiblemente fue eliminado por otro usuario" });

            switch (commandName)
            {
                case "cmdEditar":
                    return FrmEditar(registro);
                case "cmdEliminar":
                    return ConfirmarEliminar(registro);
                case "cmdPagar":
                    return FrmPagar(registro);
                case "cancelarPago":
                    return ConfirmarCancelarPago(registro);
                default:
                    return Json(new { success = false, msg = String.Format("\"{0}\" no es un comando valido", commandName) });
            }
        }
    }
}